package com.ruoyi.util.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author syc
 * @Date Created in 11:29 2022/8/9
 * @Description 通过反射机制调用一个对象的方法
 */
public class InvokeMethod {

    /**
     * @Author syc
     * @Date Created in 2022-08-09 11:35:51
     * @Description 通过反射机制调用一个对象的方法
     */
    public static void invokeMethod(){
        // 不使用反射机制，怎么调用方法
        // 创建对象
        User user = new User();
        // 调用方法
        System.out.println(user.getName());
        //使用反射机制调用方法
        Class userClass = null;
        try {
            userClass = Class.forName("com.ruoyi.util.reflect.User");
            // 创建对象
            Object obj = userClass.newInstance();
            // 获取Method
            Method loginMethod = userClass.getDeclaredMethod("setName", String.class);
//        Method loginMethod = userServiceClass.getDeclaredMethod("login");//注：没有形参就不传
            // 调用方法
            // 调用方法有几个要素？ 也需要4要素。
            // 反射机制中最最最最最重要的一个方法，必须记住。
            Object resValues = loginMethod.invoke(obj, "刘成功");//注：方法返回值是void 结果是null
            System.out.println(resValues);   // 没有返回值的
            Field noField = userClass.getDeclaredField("name");
            noField.setAccessible(true);
            System.out.println(noField.get(obj));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

//    public static void main(String[] args) {
//        InvokeMethod.invokeMethod();
//    }
}